<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>深浅拷贝介绍</title>
  </head>
  <body>
    <!-- 
       首先浅拷贝和深拷贝只针对引用类型
       浅拷贝：拷贝的是地址

       常见的拷贝方式：
            1、拷贝对象：Object.assign()  / 展开运算符{...obj} 拷贝对象
            ☆ 注意：对于Object.assign() 拷贝的对象，如果里面的值是简单数据类型那么他是深拷贝(只对简单数据类型是深拷贝)，
            但是里面存在复杂数据类型时，他是一个浅拷贝（他对复杂数据类型的拷贝是深拷贝）
            同理：{...obj} 这种方式和Object.assign()是一样的

            2、拷贝数组：Array.prototype.concat() 或则 [...arr]
     -->

    <script>
      const obj = {
        uname: "luochun",
        age: 18,
        body: {
          head: 1,
          eyes: 2,
        },
      };

      // const obj1 = Object.assign({},obj)
      // obj1.age = 20

      const obj1 = { ...obj };
      obj1.body.eyes = 20;
      console.log(obj);
      console.log(obj1);
    </script>

    <!-- 
        深拷贝：拷贝的是对象，不是地址
        常见的方法：
            1、通过递归实现
            2、lodash/cloneDeep
            3、JSON.stringify()

        递归函数：一个函数在内部可以调用其本身，那么这个函数就是递归函数
                递归很容易发生"栈溢出"，所以必须要添加退出的条件 return
      -->
    <div></div>
    <script>
      function getTime() {
        document.querySelector("div").innerHTML = new Date().toLocaleString();
        setTimeout(getTime, 1000);
      }
      getTime();
    </script>
  </body>
</html>
